/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cursoexperto.jftf.controller;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import org.cursoexperto.jftf.controller.exceptions.NonexistentEntityException;
import org.cursoexperto.jftf.controller.exceptions.PreexistingEntityException;
import org.cursoexperto.jftf.entidades.Cliente;
import org.cursoexperto.jftf.entidades.LineaVenta;
import org.cursoexperto.jftf.entidades.Venta;

/**
 *
 * @author Jose Fernando
 */
public class VentaJpaController {

    public VentaJpaController() {
        emf = Persistence.createEntityManagerFactory("WebApplicationPU");
    }
    private EntityManagerFactory emf = null;

    /**
     * Devuelve el EntityManager
     * @return EntityManager.
     */
    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    /**
     * Devuelve la venta para su identificador.
     * @param id identificador de la venta a buscar
     * @return Devuelve la venta correspondiente a la busqueda o null
     */
    public Venta findVenta(Long id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Venta.class, id);
        } finally {
            em.close();
        }
    }

    /**
     * Devuelve la lista de ventas de un cliente
     * @param usuario identificador del usuario a buscar
     * @return Devuelve la lista de ventas de un cliente
     */
    public List<Venta> findByUsuario(String usuario) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("SELECT v FROM Venta v WHERE v.cliente.usuario = :usuario "
                    + "order by v.fecha desc,v.id desc").setParameter("usuario", usuario);
            return (List<Venta>) q.getResultList();
        } catch (NoResultException ex) {
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        } catch (NonUniqueResultException ex) {
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        } finally {
            em.close();
        }
    }

    /**
     * Crea en base de datos un registro para el objeto Venta
     * @param venta identificador de la venta a crear
     */
    public void create(Venta venta) throws PreexistingEntityException, Exception {
        if (venta.getLineaVentaList() == null) {
            venta.setLineaVentaList(new ArrayList<LineaVenta>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            em.persist(venta);
            for (LineaVenta lAux : venta.getLineaVentaList()) {
                if (lAux.getVenta() == null) {
                    lAux.setVenta(venta);
                }
                em.persist(lAux);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findVenta(venta.getId()) != null) {
                throw new PreexistingEntityException("Venta " + venta + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    /**
     * Edita en base de datos un registro para el objeto Venta
     * @param venta identificador de la venta a editar
     */
    public void edit(Venta venta) throws NonexistentEntityException, Exception {
        throw new UnsupportedOperationException("Metodo no implementado");
    }

    /**
     * Borra en base de datos un registro para el objeto Venta
     * @param id identificador de la catergoria a borrar
     */
    public void destroy(Long id) throws NonexistentEntityException {
        throw new UnsupportedOperationException("Metodo no implementado");
    }

    /**
     * Encuentra todas las ventas existentes.
     * @return Lista de ventas.
     */
    public List<Venta> findVentaEntities() {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from Venta as o");
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    /**
     * Devuelve el numero de ventas
     * @return Devuelve el numero de ventas
     */
    public int getVentaCount() {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select count(o) from Venta as o");
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
}
